#ifndef __DATSTRUCT_H_
#define __DATSTRUCT_H_

#include "stm32f4xx_hal.h"
#include "main.h"

#define STOPL_EN     (0X00000001)  // 左停止有效
#define STOPR_EN     (0X00000002)  // 右停止有效
#define STOPL_L_EN   (0X00000000)  // 左输入低有效
#define STOPL_H_EN   (0X00000004)  // 左输入高有效
#define STOPR_L_EN   (0X00000000)  // 右输入低有效
#define STOPR_H_EN   (0X00000008)  // 右输入高有效
#define STOPL_N_XLATCH  (0X00000400)
#define STOPL_E_XLATCH  (0X00000800)
#define STOPR_N_XLATCH  (0X00001000)
#define STOPR_E_XLATCH  (0X00002000)
#define NEDDLE_CLACH_STOP_H (0X00030000)
#define NEDDLE_CLACH_STOP_L (0X000C0000)
#define STOPL_ACTIVE  (0X00000080)
#define STOPR_ACTIVE  (0X00000100)
/*开环板子速度寄存器值 = r/m * 895;
  闭环有8位小数,需要在乘以256*/
#define PROTO_V_TO_4361_REG(pv)  (pv*256)

enum{
	POS_REACHED,
	POS_RUNNING,
};
typedef struct {
    uint8_t SPI_Status;
	
	/*stall_tick 记录最近一次错误时间*/
	uint32_t stall_tick;
	
	/*统计一次运动过程的平均速度防止电机速度变慢的异常*/
	uint32_t pos_status; /*表示运动到位*/
	uint32_t start_tick;
	uint32_t stop_tick;
	int32_t last_relative;/*相对运动位置步数*/
	
    uint8_t MotorID;
    uint32_t REFERENCE_CONF;        /* 0x01参考开关寄存器 */
    int32_t ENC_POS;                /* 0x50编码器实际位置寄存器 */
    int32_t ENC_POS_DEV;            /* 0x52编码器实际位置和电机实际位置之差 */
    int32_t CL_OFFSET;              /* 0x59校准后编码器实际位置和电机实际位置之差 */
    int32_t XACTUAL;                /* 0x21实际位置寄存器 */
    int32_t XTARGET;                /* 0x37目标位置寄存器 */
    int32_t X_LATCH;                /* 0x36在复位后触发 将当前实际位置存到该寄存器 */
    int32_t V_ENC;                  /* 0x65编码器速度 */
    uint32_t EVENTS;                /* 0x0E触发事件寄存器 */
    uint32_t STATUS;                /* 0x0F状态寄存器 包含限位光电 速度到达 位置到达etc */
    int32_t stall_timer;
    int32_t rewriting;
    
    int32_t ENC_XACTUAL;
    int32_t U_XACTUAL;
    
    int32_t PROTO_CURRENT;          /* 协议电流 */
    int32_t PROTO_V;                /* 协议转速 与开环统一,数值为转速*895 */
    int32_t PROTO_RESET_V;          /* 协议复位转速 与开环统一,数值为转速*895 */
    int32_t PROTO_XTATGET;          /* 由于闭环中复位点目标位置不为零,而是X_LATCH所以与 */
    int32_t PROTO_XACTURAL;         /* 上位机协议中的位置参数总是相差X_LATCH */
    
    uint32_t PROTO_STATUS;          /* 协议中0x32电机状态寄存器 */
    uint8_t HOMEING_CMD;            /* 复位命令类型 */
    uint8_t HOMING_FLAG;            /* 复位状态寄存器 */
    uint8_t MOVING_FLAG;
		uint8_t POLLING_FLAG;
		
    uint8_t (*bsp_write_reg)(uint8_t, uint32_t);
    uint8_t (*bsp_read_reg)(uint8_t, uint32_t*);
		void (*bsp_nfreeze)(uint8_t freeze);
} TypeDefTMC4361_RegStruct;

/* 4361的状态寄存器 */
typedef enum {
    ACTUAL_EQ_TAR     = 0x00000001,
    VACTUAL_EQ_VMAX   = 0x00000004,
    VACTURAL_POSITIVE = 0x00000008,
    VACTURAL_NEGETIVE = 0x00000010,
    STOPL_ACTIVE_F    = 0x00000080,
    STOPR_ACTIVE_F    = 0x00000100,
    STALL_DECTED      = 0x00000800,
	STALLGUARD        = 0x01000000,
    ENC_OVER_TOL      = 0x00004000,
    HOME_FINISH       = 0x00010000,
    NEDDLE_CRASH      = 0x4000000C,
    NEDDLE_CRASH_L    = 0x4000080C,
    NEDDLE_CRASH_R    = 0x4000100C,
} tmc4361_status_t;

#endif
